/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.flf.audioteca.viewhelper.cadastros;

import br.edu.flf.audioteca.entidades.Artista;
import br.edu.flf.audioteca.enums.GenerosDeArtistas;
import br.edu.flf.audioteca.businessdelegate.IArtistaBusinessDelegate;
import br.edu.flf.audioteca.businessdelegate.impl.ArtistaBusinessDelegate;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;

/**
 * 
 * @author Nathan Azevedo
 */
public class ArtistaViewHelper {

	public static final String ROTULO_PARA_GRUPO_DE_ARTISTAS = "Nome do Artista - Genero - Local de origem";
	private static ArtistaViewHelper artistaViewHelper = null;

	public static ArtistaViewHelper getInstance() {
		if (artistaViewHelper == null) {
			artistaViewHelper = new ArtistaViewHelper();
		}
		return artistaViewHelper;

	}

	private Artista artista = new Artista();
	private Integer[] idsArtistasDeInfluencia;
	private Integer[] idsArtistasParecidos;
	private Integer generoDoArtista;
	private IArtistaBusinessDelegate artistaBusinessDelegate = null;
	private SelectItemGroup itemGroup = new SelectItemGroup();
	private List<Artista> artistasNoBanco = null;

	public Integer[] getArtistasDeInfluencia() {
		return idsArtistasDeInfluencia;
	}

	public void setArtistasDeInfluencia(Integer[] ids) {
		idsArtistasDeInfluencia = ids;
		Collection<Artista> artistasDeInfluencia = new ArrayList<Artista>();
		Artista artistaDeInfluencia = null;
		for (Integer id : ids) {
			artistaDeInfluencia = new Artista();
			artistaDeInfluencia.setCodigoArtista(id);
			artistasDeInfluencia.add(artistaDeInfluencia);
		}
		artista.setArtistasDeInfluencia(artistasDeInfluencia);
	}

	public Integer[] getArtistasParecidos() {
		return idsArtistasParecidos;
	}

	public void setArtistasParecidos(Integer[] ids) {
		idsArtistasParecidos = ids;
		Collection<Artista> artistasDeInfluencia = new ArrayList<Artista>();
		Artista artistaParecidos = null;
		for (Integer id : ids) {
			artistaParecidos = new Artista();
			artistaParecidos.setCodigoArtista(id);
			artistasDeInfluencia.add(artistaParecidos);
		}
		artista.setArtistasParecidos(artistasDeInfluencia);
	}

	public List<SelectItem> getGenerosDeArtistas() {
		GenerosDeArtistas generosDeArtistas[] = GenerosDeArtistas.values();
		List<SelectItem> listaDeGenerosDeArtistas = new LinkedList<SelectItem>();
		for (GenerosDeArtistas genero : generosDeArtistas) {
			listaDeGenerosDeArtistas.add(new SelectItem(genero, genero
					.getDescricao()));
		}
		return listaDeGenerosDeArtistas;
	}

	public Integer getGeneroDoArtista() {
		return generoDoArtista;
	}

	public String getObterDataDeCriacaoFormatadaDeArtista() {
		return DateFormat.getDateInstance().format(artista.getDataDeCricao());
	}

	public void setGeneroDoArtista(Integer genero) {
		GenerosDeArtistas generosDeArtistas[] = GenerosDeArtistas.values();

		for (GenerosDeArtistas generoAProcurar : generosDeArtistas) {
			if (generoAProcurar.ordinal() == genero) {
				artista.setGeneroDoArtista(generoAProcurar);
			}
		}
	}

	public List<SelectItem> getObterListaDeArtistas() {

		artistaBusinessDelegate = ArtistaBusinessDelegate.getInstance();

		artistasNoBanco = artistaBusinessDelegate.obterTodosOsArtistas();

		if (artistasNoBanco == null) {
			artistasNoBanco = new LinkedList<Artista>();
		}

		List<SelectItem> selectItems = obterListaDeSelectItemFormatadaParaArtistas();

		return formatarParaGrupoDeSelectItemComDescricao(selectItems,
				ROTULO_PARA_GRUPO_DE_ARTISTAS);
	}

	public List<SelectItem> getArtistaDeInfluenciaEscolhidos() {
		return getArtistasEscolhidos(idsArtistasDeInfluencia);
	}

	public List<SelectItem> getArtistaParecidosEscolhidos() {
		return getArtistasEscolhidos(idsArtistasParecidos);
	}

	private List<SelectItem> getArtistasEscolhidos(Integer[] ids) {
		List<SelectItem> selectItemsDeArtistas = obterListaDeSelectItemFormatadaParaArtistas();

		List<SelectItem> listaDeItens = new ArrayList<SelectItem>();

		for (SelectItem itemAtual : selectItemsDeArtistas) {

			for (Integer idAtual : ids) {
				if (idAtual.intValue() == ((Integer) itemAtual.getValue())
						.intValue()) {
					listaDeItens.add(itemAtual);
				}
			}

		}

		return formatarParaGrupoDeSelectItemComDescricao(listaDeItens,
				ROTULO_PARA_GRUPO_DE_ARTISTAS);
	}

	protected List<SelectItem> obterListaDeSelectItemFormatadaParaArtistas() {

		List<SelectItem> selectItems = new ArrayList<SelectItem>();
		for (Artista artistaAtual : artistasNoBanco) {
			Integer id = artistaAtual.getCodigoArtista();
			String infoArtista = artistaAtual.getNomeDoArtista() + " - "
					+ artistaAtual.getGeneroDoArtista() + " - "
					+ artistaAtual.getLocalDeOrigem();
			selectItems.add(new SelectItem(id, infoArtista));
		}
		return selectItems;

	}

	protected List<SelectItem> formatarParaGrupoDeSelectItemComDescricao(
			List<SelectItem> selectItems, String descricaoDoGrupo) {

		SelectItem[] itensArray = new SelectItem[selectItems.size()];
		for (int i = 0; i < selectItems.size(); i++) {
			itensArray[i] = selectItems.get(i);
		}
		itemGroup.setSelectItems(itensArray);
		itemGroup.setLabel(descricaoDoGrupo);

		selectItems.clear();

		selectItems.add(itemGroup);
		return selectItems;

	}

	public Artista getArtista() {
		return artista;
	}

}
